home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CU Amiga Super CD-ROM 11
/
CU Amiga Magazine's Super CD-ROM 11 (1997)(EMAP Images)(GB)(Track 1 of 3)[!][issue 1997-06].iso
/
cucd
/
programming
/
oberonv4
/
source
/
system
/
amigatimer.mod
(
.txt
)
< prev
next >
Wrap
Oberon Text
|
1996-06-02
|
3KB
|
118 lines
Syntax20b.Scn.Fnt
ParcElems
Alloc
Syntax24b.Scn.Fnt
Syntax10.Scn.Fnt
Syntax10i.Scn.Fnt
Syntax10b.Scn.Fnt
(* AMIGA *)
MODULE AmigaTimer; (* updated OJ 8 May 96 *)
IMPORT SYSTEM, E:=AmigaExec;
CONST
timerName * = "timer.device";
(* unit defintions *)
microHz * = 0;
vBlank * = 1;
eClock * = 2;
waitUntil * = 3;
waitEClock * = 4;
TimeValPtr * = LONGINT;
TimeVal * = RECORD
secs* : LONGINT;
micro* : LONGINT
END;
EClockValPtr * = LONGINT;
EClockVal * = RECORD
hi* : LONGINT;
lo* : LONGINT
END;
TimeRequestPtr * = LONGINT;
TimeRequestPointer * = POINTER TO TimeRequest;
TimeRequest * = RECORD (E.IORequest)
time* : TimeVal
END;
CONST
(* IO_COMMAND to use for adding a timer *)
addRequest * = E.nonstd+0;
getSysTime * = E.nonstd+1;
setSysTime * = E.nonstd+2;
timerBase-: E.LibraryPtr;
waitReq : TimeRequestPtr;
timerMP : E.MsgPortPtr;
timerOpen : BOOLEAN;
termEntry : E.TermEntry;
PROCEDURE -ReturnD0 04EH,05EH, 04EH,075H;
PROCEDURE AddTime*(dest, src : TimeValPtr);
BEGIN
SYSTEM.PUTREG( 8, dest );
SYSTEM.PUTREG( 9, src );
SYSTEM.CALL( -42, timerBase );
END AddTime;
PROCEDURE SubTime*(dest, src : TimeValPtr);
BEGIN
SYSTEM.PUTREG( 8, dest );
SYSTEM.PUTREG( 9, src );
SYSTEM.CALL( -48, timerBase );
END SubTime;
PROCEDURE CmpTime*(dest, src : TimeValPtr) : LONGINT;
BEGIN
SYSTEM.PUTREG( 8, dest );
SYSTEM.PUTREG( 9, src );
SYSTEM.CALL( -54, timerBase );
ReturnD0
END CmpTime;
PROCEDURE ReadEClock*(dest : EClockValPtr) : LONGINT;
BEGIN
SYSTEM.PUTREG( 8, dest );
SYSTEM.CALL( -60, timerBase );
ReturnD0
END ReadEClock;
PROCEDURE GetSysTime*(dest : TimeValPtr);
BEGIN
SYSTEM.PUTREG( 8, dest );
SYSTEM.CALL( -66, timerBase );
END GetSysTime;
PROCEDURE Wait*(sec, micro: LONGINT);
VAR wreq : TimeRequestPointer; r : SHORTINT;
BEGIN
wreq := SYSTEM.VAL( TimeRequestPointer, waitReq );
wreq.time.secs := sec;
wreq.time.micro := micro;
r := E.DoIO(waitReq)
END Wait;
PROCEDURE Term;
BEGIN
IF timerMP#0 THEN
IF waitReq#0 THEN
IF timerOpen THEN E.CloseDevice(waitReq) END;
E.DeleteIORequest( waitReq );
END;
E.DeleteMsgPort(timerMP)
END;
END Term;
PROCEDURE Init;
TYPE TReqPtr = POINTER TO TimeRequest;
VAR wreq : TimeRequestPointer;
BEGIN
waitReq := 0; timerOpen := FALSE;
timerMP:=E.CreateMsgPort();
IF timerMP#0 THEN
waitReq := E.CreateIORequest( timerMP, SIZE(TimeRequest) );
IF waitReq#0 THEN
timerOpen := ( E.OpenDevice(timerName, microHz, waitReq, {}) = 0 );
IF timerOpen THEN
wreq := SYSTEM.VAL( TimeRequestPointer, waitReq );
wreq.command := addRequest;
wreq.time.secs := 0; wreq.time.micro := 0;
timerBase := wreq.device
ELSE
HALT(99)
END;
END;
END;
END Init;
BEGIN
E.Register(termEntry, Term);
Init;
END AmigaTimer.